package ar.edu.utn.frgp.banco.dao.Implements;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.Interfaces.IntTransferencias;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.Transferencia;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class ImpTransferencias implements IntTransferencias {

	@Override
	public void AltaTransferencia(Transferencia transferencia)
			throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Insert into transferencias (id_cuentaorigen, ");
			stringBuilder.append("id_cuentadestino, fecha, monto) ");
			stringBuilder.append("VALUES (?,?,?,?) ");
			
			ps = cn.prepareStatement(stringBuilder.toString());
			
			ps.setInt(1, transferencia.getId_cuentaOrigen());
			ps.setInt(2, transferencia.getId_cuentaDestino());
			ps.setDate(3, new java.sql.Date(transferencia.getFecha().getTime()));
			ps.setDouble(4, transferencia.getMonto());

			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	@Override
	public Transferencia TraeTransferencia(Integer id_trasnsferencia)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		Transferencia tran = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_transferencia,id_cuentaorigen, ");
			stringBuilder.append("id_cuentadestino, fecha, monto ");
			stringBuilder.append("from transferencias ");
			stringBuilder.append("WHERE id_transferencia = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_trasnsferencia);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				tran = new Transferencia();
				
				tran.setId_transferencia(rs.getInt("id_transferencia"));
				tran.setId_cuentaOrigen(rs.getInt("id_cuentaorigen"));
				tran.setId_cuentaDestino(rs.getInt("id_cuentadestino"));
				tran.setFecha(rs.getDate("fecha"));
				tran.setMonto(rs.getDouble("monto"));
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return tran;
	}

	@Override
	public List<Transferencia> TraeTrasnferenciasOriginadas(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Transferencia> transferencias = new ArrayList<Transferencia>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_transferencia,id_cuentaorigen, ");
			stringBuilder.append("id_cuentadestino, fecha, monto ");
			stringBuilder.append("from transferencias ");
			stringBuilder.append("WHERE id_cuentaorigen = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			Transferencia tran = new Transferencia(); 
			while (rs.next()) {
				tran = new Transferencia();
				
				tran.setId_transferencia(rs.getInt("id_transferencia"));
				tran.setId_cuentaOrigen(rs.getInt("id_cuentaorigen"));
				tran.setId_cuentaDestino(rs.getInt("id_cuentadestino"));
				tran.setFecha(rs.getDate("fecha"));
				tran.setMonto(rs.getDouble("monto"));
				
				transferencias.add(tran);
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return transferencias;
	}

	@Override
	public List<Transferencia> TraeTrasnferenciasOriginadas(Cliente cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Cuenta> cuentas = null;
		List<Transferencia> transferencias = new ArrayList<Transferencia>();
		cuentas = cliente.getCuentas();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			for (Cuenta cuenta : cuentas){
				
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("Select id_transferencia,id_cuentaorigen, ");
				stringBuilder.append("id_cuentadestino, fecha, monto ");
				stringBuilder.append("from transferencias ");
				stringBuilder.append("WHERE id_cuentaorigen = ?");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, cuenta.getID_Cuenta());
				
				rs = ps.executeQuery();
				Transferencia tran = new Transferencia(); 
				while (rs.next()) {
					tran = new Transferencia();
					
					tran.setId_transferencia(rs.getInt("id_transferencia"));
					tran.setId_cuentaOrigen(rs.getInt("id_cuentaorigen"));
					tran.setId_cuentaDestino(rs.getInt("id_cuentadestino"));
					tran.setFecha(rs.getDate("fecha"));
					tran.setMonto(rs.getDouble("monto"));
					
					transferencias.add(tran);
				}
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return transferencias;
	}
	@Override
	public List<Transferencia> TraeTrasnferenciasRecividas(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Transferencia> transferencias = new ArrayList<Transferencia>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_transferencia,id_cuentaorigen, ");
			stringBuilder.append("id_cuentadestino, fecha, monto ");
			stringBuilder.append("from transferencias ");
			stringBuilder.append("WHERE id_cuentadestino = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			Transferencia tran = new Transferencia(); 
			while (rs.next()) {
				tran = new Transferencia();
				
				tran.setId_transferencia(rs.getInt("id_transferencia"));
				tran.setId_cuentaOrigen(rs.getInt("id_cuentaorigen"));
				tran.setId_cuentaDestino(rs.getInt("id_cuentadestino"));
				tran.setFecha(rs.getDate("fecha"));
				tran.setMonto(rs.getDouble("monto"));
				
				transferencias.add(tran);
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return transferencias;
	}

	@Override
	public List<Transferencia> TraeTrasnferenciasRecividas(Cliente cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Cuenta> cuentas = null;
		List<Transferencia> transferencias = new ArrayList<Transferencia>();
		cuentas = cliente.getCuentas();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			for (Cuenta cuenta : cuentas){
				
				StringBuilder stringBuilder = new StringBuilder();
				stringBuilder.append("Select id_transferencia,id_cuentaorigen, ");
				stringBuilder.append("id_cuentadestino, fecha, monto ");
				stringBuilder.append("from transferencias ");
				stringBuilder.append("WHERE id_cuentadestino = ?");

				ps = cn.prepareStatement(stringBuilder.toString());
				ps.setInt(1, cuenta.getID_Cuenta());
				
				rs = ps.executeQuery();
				Transferencia tran = new Transferencia(); 
				while (rs.next()) {
					tran = new Transferencia();
					
					tran.setId_transferencia(rs.getInt("id_transferencia"));
					tran.setId_cuentaOrigen(rs.getInt("id_cuentaorigen"));
					tran.setId_cuentaDestino(rs.getInt("id_cuentadestino"));
					tran.setFecha(rs.getDate("fecha"));
					tran.setMonto(rs.getDouble("monto"));
					
					transferencias.add(tran);
				}
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return transferencias;
	}
}
